//package com.qttaudio.example.simple;
//
//import android.content.DialogInterface;
//import android.content.Intent;
//import android.os.Bundle;
//import android.os.Environment;
//import android.support.v7.app.AlertDialog;
//import android.support.v7.app.AppCompatActivity;
//import android.util.Log;
//import android.view.KeyEvent;
//import android.view.View;
//import android.widget.Button;
//import android.widget.CheckBox;
//import android.widget.CompoundButton;
//import android.widget.LinearLayout;
//import android.widget.ScrollView;
//import android.widget.Switch;
//import android.widget.TextView;
//import android.widget.ToggleButton;
//
//import com.qttaudio.example.R;
//import com.qttaudio.example.utils.AudioDataObserverImpl;
//import com.qttaudio.example.utils.Mp3Player;
//import com.qttaudio.sdk.channel.AudioOutput;
//import com.qttaudio.sdk.channel.ChannelEngine;
//import com.qttaudio.sdk.channel.ChannelFactory;
//import com.qttaudio.sdk.channel.ChannelObserver;
//import com.qttaudio.sdk.channel.ChannelRole;
//import com.qttaudio.sdk.channel.ChannelUser;
//
//import java.io.FileOutputStream;
//import java.io.IOException;
//import java.io.InputStream;
//import java.util.HashMap;
//import java.util.HashSet;
//import java.util.Map;
//import java.util.Random;
//import java.util.Set;
//
//import butterknife.BindView;
//import butterknife.ButterKnife;
//import butterknife.OnClick;
//
//import static com.qttaudio.sdk.channel.ChannelRole.TALKER;
//
//
///**
// * 这个类演示了AudioChannel API的使用
// */
//public class ChannelActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
//
//    @BindView(R.id.textViewRoom)
//    TextView textViewRoom;
//    @BindView(R.id.switchSpeaker)
//    Switch switchSpeaker;
//
//    @BindView(R.id.textViewUserSize)
//    TextView textViewUserSize;
//    @BindView(R.id.textUsers)
//    TextView textUsers;
//    @BindView(R.id.scroll1)
//    ScrollView scroll1;
//    @BindView(R.id.textLogs)
//    TextView textLogs;
//    @BindView(R.id.scroll2)
//    ScrollView scroll2;
//    @BindView(R.id.toggleButtonPlay)
//    ToggleButton toggleButtonPlay;
//    @BindView(R.id.buttonStop)
//    Button buttonStop;
//    @BindView(R.id.localPlayCheck)
//    CheckBox localPlayCheck;
//    @BindView(R.id.remotePlayCheck)
//    CheckBox remotePlayCheck;
//    @BindView(R.id.switchHowling)
//    Switch switchHowling;
//    @BindView(R.id.toggleRecord)
//    ToggleButton toggleRecord;
//    @BindView(R.id.linearLayout)
//    LinearLayout linearLayout;
//    @BindView(R.id.checkRecordAll)
//    CheckBox checkRecordAll;
//    @BindView(R.id.checkRecordMic)
//    CheckBox checkRecordMic;
//    @BindView(R.id.checkRecordSpeaker)
//    CheckBox checkRecordSpeaker;
//    @BindView(R.id.linearLayout2)
//    LinearLayout linearLayout2;
//    @BindView(R.id.buttonPlay)
//    Button buttonRecordPlay;
//    @BindView(R.id.toggleRole)
//    ToggleButton toggleRole;
//    @BindView(R.id.buttonMute)
//    Button buttonMute;
//    @BindView(R.id.toggleWisper)
//    ToggleButton toggleWisper;
//
//    private int lines = 0;
//    private ChannelObserverImpl channelObserver = null;
//    private volatile int channelUserSize = 0;
//    private long roomId = 0;
//    private Map<Long, Boolean> talkerlist;
//    private Set<Long> audiencelist;
//    private Mp3Player mp3Player = new Mp3Player();
//    private AudioDataObserverImpl audioDataObserver = new AudioDataObserverImpl();
//    private ChannelRole mRole;
//    private int mUid = -1;
//    private ChannelEngine audioChannel = null;
//
//    @Override
//    protected void onCreate(Bundle savedInstanceState) {
//        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_channel);
//        ButterKnife.bind(this);
//        roomId = Long.parseLong(getIntent().getStringExtra("roomId"));
//        mUid = new Random().nextInt(100000);
//        setTitle("房间: " + roomId);
//        textViewRoom.setText("ID: " + mUid);
//        textLogs.append("\n");
//
//        channelObserver = new ChannelObserverImpl();
//        talkerlist = new HashMap<>();
//        audiencelist = new HashSet<>();
//
//        checkRecordAll.setVisibility(View.GONE);
//        audioChannel = ChannelFactory.GetChannelInstance();
//        audioChannel.setUid(mUid);
//        audioChannel.setObserver(channelObserver);
////        audioChannel.setServer(0, "192.168.2.42", 9009);
//        mRole = ChannelRole.TALKER;
//        toggleRole.setChecked(true);
//        audioChannel.join(roomId, mRole);
//        mp3Player.setFile(copyFile("bmg.mp3"));
//
//        toggleButtonPlay.setOnCheckedChangeListener(this);
//        localPlayCheck.setOnCheckedChangeListener(this);
//        remotePlayCheck.setOnCheckedChangeListener(this);
//        switchSpeaker.setOnCheckedChangeListener(this);
//        switchHowling.setOnCheckedChangeListener(this);
//        toggleRecord.setOnCheckedChangeListener(this);
//        toggleRole.setOnCheckedChangeListener(this);
//        toggleWisper.setOnCheckedChangeListener(this);
//    }
//
//    @Override
//    protected void onDestroy() {
//        super.onDestroy();
//        audioChannel.leave();
//        mp3Player.stop();
//    }
//
//    private void appendLogs(final String msg) {
//        runOnUiThread(new Runnable() {
//            @Override
//            public void run() {
////                if (lines > 30) {
////                    textLogs.setText("");
////                    lines = 0;
////                }
////                textLogs.append(msg);
////                textLogs.append("\n");
////                lines++;
//                textViewUserSize.setText("人数: " + channelUserSize);
////                scroll2.fullScroll(ScrollView.FOCUS_DOWN);
//            }
//        });
//    }
//
//    private void updateTalkerList(long uid, Boolean isJoin, Boolean isMute, String message) {
//        if (isJoin != null) {
//            if (isJoin)
//                talkerlist.put(uid, isMute);
//            else
//                talkerlist.remove(uid);
//        } else {
//            if (talkerlist.containsKey(uid))
//                talkerlist.put(uid, isMute);
//        }
//        String userString = "";
//        for (Map.Entry<Long, Boolean> entry : talkerlist.entrySet()) {
//            userString += entry.getKey();
//            if (entry.getKey() == uid)
//                userString+=message;
//            if (entry.getValue())
//                userString += ",静音\n";
//            else
//                userString += "\n";
//
//        }
//        final String msg = userString;
//        runOnUiThread(new Runnable() {
//            @Override
//            public void run() {
//                textUsers.setText(msg);
//                scroll1.fullScroll(ScrollView.FOCUS_DOWN);
//            }
//        });
//    }
//    private void updateTalkerList(ChannelUser user, Boolean isJoin, Boolean isMute) {
//        long uid = user.getUid();
//        int lossRate = (int) (user.getLossRate()*100);
//        String netstat = ", j="+user.getJitter()+", s="+user.getCurbps()+", l="+lossRate;
//        updateTalkerList(uid, isJoin, isMute, netstat);
//    }
//
//    private void updateAudienceList(long uid, boolean isJoin) {
//        if (isJoin)
//            audiencelist.add(uid);
//        else
//            audiencelist.remove(uid);
//        String userString = "";
//        for (Long tmp : audiencelist) {
//            userString += tmp + "\n";
//        }
//        final String msg = userString;
//        runOnUiThread(new Runnable() {
//            @Override
//            public void run() {
//                textLogs.setText(msg);
//                scroll1.fullScroll(ScrollView.FOCUS_DOWN);
//            }
//        });
//    }
//
//
//    private String copyFile(String fileName) {
//        String result = getFilesDir() + "/" + fileName;
//        try {
//            InputStream is = getAssets().open(fileName);
//            FileOutputStream fos = new FileOutputStream(result);
//            byte[] buffer = new byte[4096];
//            int len = -1;
//            while ((len = is.read(buffer)) != -1) {
//                fos.write(buffer, 0, len);
//            }
//            fos.flush();
//            fos.close();
//            is.close();
//            return result;
//        } catch (IOException e) {
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    @Override
//    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
//        switch (compoundButton.getId()) {
//            case R.id.localPlayCheck:
//                mp3Player.enableLocalPlay(b);
//                break;
//            case R.id.remotePlayCheck:
//                mp3Player.enableRemotePlay(b);
//                break;
//            case R.id.switchSpeaker:
//                if (b)
//                    AudioOutput.routeAudioTo(AudioOutput.SPEAKER);
//                else
//                    AudioOutput.routeAudioTo(AudioOutput.HEADPHONE);
//                break;
//            case R.id.toggleButtonPlay:
//                if (b) {
//                    mp3Player.enableLocalPlay(localPlayCheck.isChecked());
//                    mp3Player.enableRemotePlay(remotePlayCheck.isChecked());
//                    mp3Player.start();
//                } else {
//                    mp3Player.pause();
//                }
//                break;
//            case R.id.switchHowling:
////                audioChannel.getEngine().enableHowlingSuppression(b);
//                break;
//            case R.id.toggleRecord:
//                if (b) {
//                    boolean record = false;
//                    boolean playback = false;
//                    if (checkRecordMic.isChecked()) {
//                        record = true;
//                    }
//                    if (checkRecordSpeaker.isChecked()) {
//                        playback = true;
//                    }
//                    audioDataObserver.startRecord(record, playback, Environment.getExternalStorageDirectory().getAbsolutePath()+"/qttaudio");
//
//                    checkRecordMic.setEnabled(false);
//                    checkRecordSpeaker.setEnabled(false);
//                    checkRecordAll.setEnabled(false);
//                    buttonRecordPlay.setEnabled(false);
//                } else {
//                    audioDataObserver.stopRecord();
//                    checkRecordMic.setEnabled(true);
//                    checkRecordSpeaker.setEnabled(true);
//                    checkRecordAll.setEnabled(true);
//                    buttonRecordPlay.setEnabled(true);
//                }
//                break;
//            case R.id.toggleRole:
//                if (b) {
//                    if (audioChannel.changeRole(ChannelRole.TALKER) == 0) {
//                        updateTalkerList(mUid, true, false, "");
//                        updateAudienceList(mUid, false);
//                        toggleWisper.setEnabled(true);
//                    }
//                } else {
//                    if (audioChannel.changeRole(ChannelRole.AUDIENCE) == 0) {
//                        updateTalkerList(mUid, false, false, "");
//                        updateAudienceList(mUid, true);
//                        toggleWisper.setEnabled(false);
//                    }
//                }
//                break;
//            case R.id.toggleWisper:
//                break;
//        }
//    }
//
//    @OnClick(R.id.buttonStop)
//    public void onButtonStopClicked() {
//        mp3Player.stop();
//        toggleButtonPlay.setChecked(false);
//    }
//
//    @Override
//    public boolean onKeyDown(int keyCode, KeyEvent event) {
//        if (keyCode == KeyEvent.KEYCODE_BACK) {
//            AlertDialog.Builder builder = new AlertDialog.Builder(this);
//            builder.setMessage("确定要退出房间吗？")
//                    .setCancelable(false)
//                    .setPositiveButton("确定",
//                            new DialogInterface.OnClickListener() {
//                                public void onClick(DialogInterface dialog,
//                                                    int id) {
//                                    audioChannel.leave();
//                                    finish();
//                                }
//                            })
//                    .setNegativeButton("取消",
//                            new DialogInterface.OnClickListener() {
//                                public void onClick(DialogInterface dialog, int id) {
//                                    dialog.cancel();
//                                }
//                            });
//            AlertDialog alert = builder.create();
//            alert.show();
//            return true;
//        }
//        return super.onKeyDown(keyCode, event);
//    }
//
//    @OnClick(R.id.buttonPlay)
//    public void onButtonPlayClicked() {
//        audioChannel.leave();
//        finish();
//        Intent intent = new Intent();
//        intent.setClass(this, WavFileActivity.class);
//        startActivity(intent);
//    }
//
//    @OnClick(R.id.buttonMute)
//    public void onButtonMuteClicked() {
//        final String[] userString = new String[talkerlist.size()];
//        boolean[] muteArray = new boolean[talkerlist.size()];
//        int i = 0;
//        for (Map.Entry<Long, Boolean> entry : talkerlist.entrySet()) {
//            userString[i] = entry.getKey()+"";
//            muteArray[i] = entry.getValue();
//            i++;
//        }
//        final Set<Long> muteList = new HashSet<>();
//        AlertDialog dialog = new AlertDialog.Builder(this).setTitle("多选对话框")
//                .setPositiveButton("确定", null)
//                .setMultiChoiceItems(userString, muteArray, new DialogInterface.OnMultiChoiceClickListener() {
//                    @Override
//                    public void onClick(DialogInterface dialog, int which, boolean isChecked) {
//                        Log.d("qtt_debug", "which="+which+",check="+isChecked);
//                        Long userId = Long.parseLong(userString[which]);
//                        updateTalkerList(userId, null, isChecked, "");
//                        audioChannel.mute(userId, isChecked);
//                    }
//                }).create();
//        dialog.show();
//    }
//
//    private class ChannelObserverImpl implements ChannelObserver {
//        public void onJoinSuccess() {
//            Log.d("qtt_debug", "onJoinSuccess");
//            channelUserSize++;
////            appendLogs("---------进入房间成功-------\n");
//            if (mRole == TALKER)
//                updateTalkerList(mUid, true, false, "");
//            else
//                updateAudienceList(mUid, true);
//        }
//
//        public void onJoinFail(int code, String message) {
//            Log.d("qtt_debug", "onJoinFail " + message);
////            appendLogs("--------进入房间失败：" + message + "\n");
//            finish();
//        }
//
//        public void onClose() {
//            Log.d("qtt_debug", "onClose");
////            appendLogs("--------网络连接断开\n");
//            finish();
//        }
//
//        public void onSelfTalking(int talking) {
//            Log.d("qtt_debug", "onSelfTalking " + talking);
////            appendLogs("自己说话状态： " + talking + "\n");
//        }
//
//        public void onOtherJoin(ChannelUser user) {
//            Log.d("qtt_debug", "onOtherJoin " + user.getUid());
//            channelUserSize++;
//            appendLogs("--------" + user.getUid() + " 加入\n");
//            if (user.getAudioRole() == TALKER)
//                updateTalkerList(user.getUid(), true, user.isMuted(), "");
//            else
//                updateAudienceList(user.getUid(), true);
//        }
//
//        public void onOtherLeave(ChannelUser user) {
//            Log.d("qtt_debug", "onOtherLeave " + user.getUid());
//            channelUserSize--;
//            appendLogs("--------" + user.getUid() + " 离开\n");
//            updateTalkerList(user.getUid(), false, false, "");
//            updateAudienceList(user.getUid(), false);
//        }
//
//        public void onOtherTalking(ChannelUser user, int talking) {
//            Log.d("qtt_debug", "onOtherTalking " + user.getUid() + ", talking=" + talking);
////            appendLogs(user.getUid() + " 说话状态：" + talking + "\n");
//        }
//
//        public void onOtherMuted(ChannelUser user) {
//            Log.d("qtt_debug", "onOtherMute " + user.getUid());
//            updateTalkerList(user.getUid(), null, user.isMuted(), "");
//        }
//
//        public void onOtherRoleChanged(ChannelUser user) {
//            Log.d("qtt_debug", "onOtherRoleChanged " + user.getUid() + ", 角色状态=" + user.getAudioRole());
//            appendLogs(user.getUid() + " 角色状态：" + user.getAudioRole() + "\n");
//            if (user.getAudioRole() == TALKER) {
//                updateTalkerList(user.getUid(), true, user.isMuted(), "");
//                updateAudienceList(user.getUid(), false);
//            } else {
//                updateTalkerList(user.getUid(), false, false, "");
//                updateAudienceList(user.getUid(), true);
//            }
//        }
//
//        public void onOtherNetworkStats(final ChannelUser user, int myRtt) {
//            Log.d("qtt_debug", "onOtherNetworkStats " + user.getUid() + ", bps=" + user.getCurbps());
//            updateTalkerList(user, null, user.isMuted());
//        }
//    }
//}
